package com.ztr.minio;

import com.amazonaws.util.IOUtils;
import io.minio.*;
import io.minio.errors.MinioException;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * @author zhouYi
 * @description TODO
 * @date 2023/2/14 17:47
 */
public class MinIOTest {

    static MinioClient minioClient =
            MinioClient.builder()
                    //url先择任何一个server
                    .endpoint("http://192.168.195.128:9000")
                    //用户名密码
                    .credentials("minioadmin", "minioadmin")
                    .build();

    /**
     * 上传文件到MinIO服务器。
     *
     * @throws IOException              如果发生I/O错误
     * @throws NoSuchAlgorithmException 如果请求的算法不可用
     * @throws InvalidKeyException      如果提供的密钥无效
     */
    public static void upload() throws IOException, NoSuchAlgorithmException, InvalidKeyException {
        try {
            // 检查"test"桶是否存在，如果不存在则创建
            boolean found =
                    minioClient.bucketExists(BucketExistsArgs.builder()
                            .bucket("test").build());
            if (!found) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
            } else {
                System.out.println("Bucket 'test' already exists.");
            }

            // 上传文件"credentials.json"到"test"桶
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("test")
                            .object("credentials.json")
                            .filename("D:\\test\\credentials.json")
                            .build());

            // 上传文件"license.lic"到"test"桶的"minio"子目录
            minioClient.uploadObject(
                    UploadObjectArgs.builder()
                            .bucket("test")
                            .object("minio/license.lic")
                            .filename("D:\\test\\license.lic")
                            .build());
            System.out.println("上传成功");
        } catch (MinioException e) {
            // 打印MinIO操作中可能出现的异常信息
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }
    }


    /**
     * 删除指定存储桶中的文件。
     *
     * @param bucket   存储桶的名称。
     * @param filepath 要删除的文件路径。
     * @throws IOException              当进行IO操作时发生错误。
     * @throws NoSuchAlgorithmException 当算法不可用时抛出此异常。
     * @throws InvalidKeyException      当提供的密钥无效时抛出此异常。
     */
    public static void delete(String bucket, String filepath) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
        try {
            // 使用MinIO客户端删除指定存储桶中的文件
            minioClient.removeObject(
                    RemoveObjectArgs.builder().bucket(bucket).object(filepath).build());
            System.out.println("删除成功");
        } catch (MinioException e) {
            // 打印MinIO操作异常信息
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }
    }


    /**
     * 下载MinIO服务上指定存储桶中的文件到本地。
     *
     * @param bucket   存储桶名称。
     * @param filepath MinIO中文件的路径。
     * @param outFile  下载后文件的本地路径。
     * @throws IOException              当进行输入/输出操作时发生错误。
     * @throws NoSuchAlgorithmException 当请求的加密算法不可用时抛出。
     * @throws InvalidKeyException      当提供无效的密钥时抛出。
     */
    public static void getFile(String bucket, String filepath, String outFile) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
        try {


            try (InputStream stream = minioClient.getObject(
                    GetObjectArgs.builder()
                            .bucket(bucket)
                            .object(filepath)
                            .build());
                 FileOutputStream fileOutputStream = new FileOutputStream(outFile)
            ) {

                // 从输入流中读取数据并写入输出文件
                IOUtils.copy(stream, fileOutputStream);
                System.out.println("下载成功");
            }

        } catch (MinioException e) {
            // 处理MinIO操作异常
            System.out.println("Error occurred: " + e);
            System.out.println("HTTP trace: " + e.httpTrace());
        }

    }


    public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
        upload();
        delete("test","credentials.json");
        delete("test","minio/license.lic");
        getFile("test","minio/license.lic","D:\\license.lic");
        getFile("ztrbucket01","123/10.jpg","D:\\10.jpg");
    }


}

